package vista;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;

import controlador.ControladorMouse;
import godzilla.ciudad.estructuras.Estructura;
import godzilla.ciudad.estructuras.Superficie;
import modelo.ModeloDelJuego;
import modelo.Ubicacion;

public class Vista extends JPanel implements Observer{

	/**
	 * 
	 */
	private static final long serialVersionUID = 7583033966208869324L;
	
	private ModeloDelJuego modelo;
	private Ubicacion posicion;
	private ListaDeRepresentaciones listaDeRepresentaciones;

	private int nivelObservado;





	public Vista(Ubicacion posicion , ModeloDelJuego modelo , ListaDeRepresentaciones listaDeRepresentaciones) {

		this.listaDeRepresentaciones = listaDeRepresentaciones;
        this.posicion = posicion;
        this.modelo = modelo;
		setPreferredSize(new Dimension(25,25));
        this.modelo.addObserver(this);
        addMouseListener(new ControladorMouse(modelo, this));

        this.nivelObservado = 1;

	}

	public int ancho() {

		return modelo.ancho();
	}

	public int alto() {

		return modelo.alto();
	}

	private Superficie verSuperficie() {


		Superficie dato = null;
		if (nivelObservado==1) dato = modelo.getSuperficiePlantaBaja(posicion);
		if (nivelObservado==0) dato = modelo.getSuperficieSubterranea(posicion);

		return dato;

		
	}
	
    private RepresentacionEstructura crearRepresentacion(Estructura dato) {
		RepresentacionEstructura representacion = this.listaDeRepresentaciones.obtenerRepresentacion(dato);
		return representacion;
	}

	public void paintComponent(Graphics grafico) {

        super.paintComponent(grafico);
        Superficie superficie = verSuperficie();
        RepresentacionEstructura representacion = crearRepresentacion(superficie.estructuraContenida());
        grafico.setColor(new Color(100,100,0));
        grafico.drawRect(0,0, 25, 25);
        if (superficie.esAgua()) grafico.drawImage( RepresentacionEstructura.imagenAgua(), 0, 0, null);
        grafico.drawImage( representacion.imagenAsociada(), 0, 0, null);       
        if (!superficie.estructuraContenida().necesidadesSatisfechas()) grafico.drawImage( RepresentacionEstructura.imagenProblemas(), 0, 0, null);
        if (!superficie.estructuraContenida().enPie()) grafico.drawImage( RepresentacionEstructura.imagenDestruido(), 0, 0, null);
        if (superficie==modelo.verSuperficiePisadaPorGodzilla()) grafico.drawImage( RepresentacionEstructura.imagenGodzilla(), 0, 0, null);
    }
    

	@Override
	public void update(Observable arg0, Object arg1) {	

		
		repaint();
		
	}

	public Ubicacion posicion() {

		return posicion;
	}

	public void cambiarAVistaPlantaBaja() {


		repaint();
		this.nivelObservado=1;
		
	}

	public void cambiarAVistaSubterranea() {


		repaint();
		this.nivelObservado=0;
		
	}
	
	
	
}
